Forum des exercices du projet Zuul

Exercice 7.28.1

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.28.1
par anonfirstname2 anonlastname2, mercredi 28 juin 2017, 21:46
 

Créer une nouvelle commande test acceptant un second mot représentant un nom de fichier (supposé se trouver dans le répertoire courant), et exécutant successivement toutes les commandes lues dans ce fichier de texte ; pour cela vous pouvez :
- lire la rubrique Plus de technique en tête de la liste des exercices
- chercher (CTRL-F) le mot "needs" pour trouver d'autres explications en bas de cette page
- lire le résumé de cours de l'exercice 7.28.3

Attention !
- Les noms des fichiers de commandes porteront forcément l'extension .txt .
- Il ne doit pas être nécessaire de taper cette extension. Par exemple, la commande test essai lira automatiquement dans le fichier essai.txt .
Ceci devra pouvoir être testé dans toutes les versions qu'il vous sera demandé de rendre.

Avatar Jean COULOM
Re: Exercice 7.28.1
par Jean COULOM, mercredi 2 novembre 2016, 22:45
 

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...

A côté de ça mon fichier test renferme simplement :

go
help
look
quit

Mais rien ne s'affiche à l'écran quand je lance test et j'aimerais savoir ce qui ne va pas.

Cordialement.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, jeudi 17 octobre 2013, 08:48
 

Passons tranquillement en revue tout ce qui ne va pas dans le code ci-dessus :

  1. vFichier est une String, donc new Scanner(vFichier) va scanner la String et non le fichier qui porte ce nom.
    Relisez plus attentivement la solution en bleu de cette page.

  2. String mot = vScan.next(); ne va lire qu'un seul mot dans le fichier, alors qu'une commande en comprend souvent deux. Il faut lire ligne par ligne et non mot par mot, comme lorsqu'on tape les commandes au clavier. Les méthodes du Scanner à utiliser pour cela sont également données en bleu dans la page citée au point 1.

  3. if (vScan ==null) { vScan.close(); } est plutôt gênant : quand une référence est nulle, on n'a pas le droit d'écrire réf.méthode() sous peine de provoquer une NullPointerException.

  4. Une fois que que 3 problèmes seront corrigés, il n'y aura toujours rien d'affiché à l'écran, tout simplement parce-qu'il n'y a aucune instruction d'affichage dans ce code, ni aucun appel de méthode qui provoquerait un affichage. Ne faudrait-il pas exécuter chaque commande lue dans le fichier ?
Avatar Julien UNG
Re: Exercice 7.28.1
par Julien UNG, lundi 6 janvier 2014, 15:49
 

Bonjour,

Lorsque je lance le jeu en applette, tout fonctionne normalement, mais lorsque je le lance sous la forme d'un fichier .jar, l'ordinateur n'arrive pas à accéder aux fichiers de tests et donc me le jeu me dit que le fichier n'a pas été trouvé.

Voici la ligne de code qui permet d'accéder à mon fichier test :

vScan = new Scanner (new File("tests/"+this.getSecondWord()+".txt"));

La variable vScan est mon fichier scan initialisé à null.

Merci d'avance.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, lundi 6 janvier 2014, 17:19
 

La rubrique "Plus de technique" dit entre autres :

De façon générale, pour accéder à un fichier (même dans le répertoire courant), utiliser :
java.net.URL monURL = this.getClass().getClassLoader().getResource( "chemin_relatif/nom_de_fichier.extension" );
faute de quoi, le jeu ne fonctionnera pas en applette et ne pourra pas être distribué sous forme de fichier archive.

Avatar Pacien TRAN-GIRARD
Re: Exercice 7.28.1
par Pacien TRAN-GIRARD, mercredi 12 mars 2014, 17:58
 

Serait-il possible d'implémenter cette fonctionnalité de test non pas en tant que commande dans le jeu, mais plutôt en tant que paramètre lors de l'exécution en ligne de commande du jeu ($ java -jar monJeu.jar --test commandes.txt) ?

En effet, cela semble plus adapté à la tache de test et nous faciliterait l'automatisation des tests globaux.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mercredi 12 mars 2014, 19:49
 

si vous voulez

Avatar Adrien MANGE
Re: Exercice 7.28.1
par Adrien MANGE, dimanche 4 mai 2014, 15:05
 

Je n'arrive pas bien à comprendre ce que doit faire cette commande. Voila ce que j'ai compris en gros:

il faut créer un fichier texte dans lequel on écrit toutes les commandes qu'on estime nécessaire de tester. Dans le code du jeu on créer une nouvelle commande "test" qui permet de lire le-dit fichier.Et c'est la que je ne sais plus,
faut-il mettre dans le fichier texte la description de ce que doit faire telle ou telle commande ou bien exécuter toutes les commandes et dans ce dernier cas concrètement que doit faire le programme ?

Avatar Jonathan MORELL
Re: Exercice 7.28.1
par Jonathan MORELL, dimanche 4 mai 2014, 18:32
 

Dans ton fichier, il faut que tu écrives comme si c'est l'utilisateur qui écrivait tes commandes.

Donc fait bien attention de sauter des lignes à chaque fin de commandes.

N'oublie pas que ton parser ne récupère que deux mots!

Ta fonction test doit récupérer donc les commandes mais aussi les afficher pour comprendre quelles commandes ont été saisies.

En gros ta fonction test va permettre à la fin de voir si toutes tes commandes fonctionnent correctement.

PS: Tu peux choisir l'extension que tu veux de ton fichier et ne pas le laisser forcément en extension txt.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, dimanche 4 mai 2014, 22:54
 

Le but de cette commande test est bien d'exécuter toutes les commandes présentes dans le fichier de texte comme si elles avaient été tapées par le joueur.

Si vous savez faire en sorte qu'une commande tapée par le joueur s'exécute, pourquoi ne sauriez-vous pas faire en sorte qu'une commande lue dans un fichier s'exécute de la même manière ?

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mercredi 21 mai 2014, 00:00
 

Un étudiant a écrit :

bonsoir

java me dit :
 

exception java.io.FileNotFoundException is never thrown in body of corresponding try statement

 

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mercredi 21 mai 2014, 00:04
 

oui, il vous prévient qu'aucune instruction dans le bloc try ne risque de déclencher une FileNotFoundException : il faut donc supprimer le bloc try à cet endroit, ou bien englober une autre instruction qui, elle, peut déclencher cette exception.

A quel moment (ou à quelle instruction) le système peut-il dire "Je ne trouve pas le fichier que vous me demandez." ?

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, samedi 24 mai 2014, 19:55
 

Un étudiant a écrit :

Bonjour Monsieur,

J'essaye de configurer la commande test mais il y a certaines choses dont je ne suis pas sur.

.../...

Que faut-il écrire dans la barre d'entrée du jeu ? test suivi du chemin du fichier texte ? 

Merci de votre réponse,

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, samedi 24 mai 2014, 19:54
 

tout à fait : si vous tapez  test fich1.txt  votre programme ira lire dans le fichier fich1.txt du répertoire de votre projet BlueJ.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mardi 10 juin 2014, 13:21
 

Un étudiant a écrit :

Bonjour monsieur, Nous avons rendu une premiere version du projet mais quand nous testons notre .jar, les fichiers de commandes sont introuvables. Comment pouvons nous resoudre ce probleme? Merci d'avance

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mardi 10 juin 2014, 13:22
 

Voir la rubrique Plus de technique pour la bonne façon d'accéder aux fichiers (notamment dans un .jar).

Avatar Yanis GUICHI
Re: Exercice 7.28.1
par Yanis GUICHI, mercredi 2 novembre 2016, 22:46
 
Bonjour,

J'ai essayé de créer un fichier .txt afin que toutes les pièces du jeu sont visitées mais je rencontre un problème lors de la compilation.

Voici ma procédure test:

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...
        
        try {vScanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream("" +vFichier +".txt"));}
        catch (java.io.FileNotFoundException pException) {aGUI.println("File not found");}
        
.../... code supprimé pour ne pas influencer les futurs lecteurs .../...

L'erreur en question est la suivante: exception java.io.FileNotFoundException is never thrown in body of corresponding try statement, qui survient lors de la compilation de la ligne en gras.

Je ne vois pas d'où peut venir l'erreur et j'ai essayé de compiler même en ayant aucun fichier .txt dans le répertoire du projet sans succès.

Cordialement.
Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, vendredi 10 octobre 2014, 22:58
 

1) Regardons d'abord les conclusions que vous tirez du message d'erreur :

Vous avez une erreur de compilation et vous en déduisez que cela peut avoir un rapport avec la présence ou l'absence d'un fichier .txt dans le répertoire du projet !?
Une erreur de compilation ne peut provenir que d'un problème java. Pourquoi ne pas avoir traduit le message ? Il vous indique clairement que l'exception FileNotFound n'est jamais lancée dans le bloc try.

2) Essayons maintenant d'expliquer ce message d'erreur :

FileNotFoundException ne peut être lancée que si l'on ouvre le fichier par
new Scanner( new File( nom_fichier ) )

Si on l'ouvre avec la technique que vous utilisez, c'est une NullPointerException qui surviendra lorsque le fichier ne sera pas trouvé.
Plutôt que de provoquer une exception, vous pouvez aussi tester que le paramètre du constructeur de Scanner n'est pas null.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, samedi 11 octobre 2014, 16:34
 

Un étudiant a écrit :

Bonsoir, 
     je vous envoie ce message car j'aimerais avoir des précisions sur le
traitement d'une exception. Si j'ai bien compris, le principe consiste à
enfermer dans une boucle (précédée du mot clé try) un ensemble
d'instructions susceptibles d'engendrer une exception (comme
FileNotFoundException); suivie ensuite d'une autre boucle précédée par le
mot clé catch. Lorsqu'une exception est détectée, le programme quitte la
boucle try et rentre dans la boucle catch. La où j'ai du mal à comprendre
c'est comment doit on gérer cette exception? 
Si elle a lieu, ne doit-on pas juste mettre comme instruction dans notre boucle
catch: 

catch (Exception e){
	aGui.println(e.toString());
		}
qui renverrait juste le détail de l'exception e (ici FileNotFoundException)?
Ou il y a t-il d'autres moyens de traiter une exception mis à part de
l'afficher?
Au final le but est que, même s'il y a une erreur, le programme ne s'arrête
pas brutalement mais continue à s'exécuter.

cordialement,
Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, samedi 11 octobre 2014, 16:44
 

Vous avez tout à fait compris le principe : "le but est que, même s'il y a une erreur, le programme ne s'arrête
pas brutalement mais continue à s'exécuter"
.

Quelques précisions :

- vous confondez boucle et bloc : des instructions encadrées par des accolades s'appellent un bloc d'instructions ; une boucle est un bloc d'instructions qui se répète plusieurs fois. On parle donc de bloc try et de bloc catch.

- on peut faire autre chose que de simplement afficher "FileNotFoundException", par exemple, afficher "Je n'ai pas trouvé le fichier abcd.txt !", ou encore mieux, redemander à l'utilisateur de saisir un autre nom de fichier.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mercredi 11 décembre 2019, 14:37
 

Un étudiant a écrit :

Afin d'améliorer mes tests en utilisant les chemins relatifs pour la lecture des fichiers, il se trouve que ma gestion d'exceptions ne marche plus. En effet, il semblerait qu'aucune des méthodes appelées par cette ligne "java.io.InputStream vFile = this.getClass().getClassLoader().getResourceAsStream("./pFileName.txt"); " n'envoie de FileNotFoundException.

J'ai essayé d'utiliser la IOException (j'ai fait l'import) mais rien n'y fait, ma classe GameEngine ne compile plus à cause de l'instruction catch qui me dit qu'aucune ligne dans le try ne renvoie de FileNotFoundException (ni de IOException).

À la rigueur je pourrais ne pas utiliser l'InputStream et garder cette ligne "File vFile = new File(pFileName);" mais j'aimerais bien comprendre comment régler ce soucis...

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, mercredi 11 décembre 2019, 14:41
 

Effectivement, ce moyen d'accès aux fichiers ne lance pas d'exception s'il ne trouve pas le fichier.

Il renvoie simplement null, qu'il faut donc tester plutôt que traiter l'exception.

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, lundi 14 décembre 2020, 17:36
 

Un étudiant a écrit :

Dois t-on créer une classe à part entière LectureFichierSimple pour pouvoir effectuer la commande test (comme dans « Plus de technique »), ou alors simplement importer toutes les bibliothèques nécessaires dans la classe GameEngine (et ainsi créer un Scanner dedans) ?

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, lundi 14 décembre 2020, 17:38
 

Vous pouvez tout incorporer dans GameEngine (créez une méthode quand-même ...).

Si vous faites l'exercice 7.47, vous créerez une classe à part (comme pour les autres commandes).

Avatar Marvyn MARTINEZ
Re: Exercice 7.28.1
par anonname1, mercredi 17 mars 2023, 19:40
 

Un étudiant a écrit :

Bonjour,

J'ai essayé d'écrire une méthode test dans GameEngine mais j'ai une erreur de compilation que je ne comprends pas :
"The possible exception of type java.io.FileNotFoundException needs to be handled"

Avatar Denis BUREAU
Re: Exercice 7.28.1
par Denis BUREAU, jeudi 18 mars 2023, 09:44
 

On vous parle de possible exception "Fichier non trouvé" qui n'est pas gérée. Le compilateur voit que vous utilisez une instruction susceptible de lancer cette exception (probablement new File(...)) et veut logiquement :
- soit que vous disiez explicitement que vous ne gérez pas cette exception (mais cela reporterait le problème dans la méthode appelante)
- soit que vous gériez effectivement cette exception par un try/catch.
Pour savoir comment faire, lisez la partie "Lecture simple de fichiers de texte" de la rubrique Plus de technique figurant en tête de la liste officielle des exercices.